home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / impl / olist1.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-05  |  2.8 KB  |  116 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  olist1.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_OLIST1_H
  16. #define LEDA_OLIST1_H
  17.  
  18. //------------------------------------------------------------------------------
  19. //  doubly linked circular lists
  20. //------------------------------------------------------------------------------
  21.  
  22. #include <LEDA/basic.h>
  23.  
  24. //------------------------------------------------------------------------------
  25. // class olink1 (base class for all list items)
  26. //------------------------------------------------------------------------------
  27.  
  28. class olink1 {
  29.  
  30.   olink1* succ;
  31.   olink1* pred;
  32.  
  33. public:
  34.  
  35.   olink1* succ_item() { return succ; }
  36.   olink1* pred_item() { return pred; }
  37.  
  38.   void    del_item() { olink1*  p = pred;
  39.                        olink1*  s = succ;
  40.                        p->succ = s;
  41.                        s->pred = p; }
  42.  
  43.   LEDA_MEMORY(olink1)
  44.  
  45.   friend class olist1;
  46.  
  47. };
  48.  
  49.  
  50. //------------------------------------------------------------------------------
  51. // olist1: base class for all doubly linked lists
  52. //------------------------------------------------------------------------------
  53.  
  54. class olist1 : public olink1 {
  55.  
  56. public:
  57.  
  58.  
  59. // access operations
  60.  
  61.    bool empty()  const { return (succ==this) ? true : false;}
  62.  
  63.    olink1* first()                const { return (succ==this) ? nil : succ; }
  64.    olink1* last()                 const { return (pred==this) ? nil : pred; }
  65.    olink1* first_item()           const { return first(); }
  66.    olink1* last_item()            const { return last(); }
  67.    olink1* next_item(olink1* p)   const { return succ(p); }
  68.  
  69.    olink1* succ(olink1* p) const { return (p->succ==this)? nil : p->succ; }
  70.    olink1* pred(olink1* p) const { return (p->pred==this)? nil : p->pred; }
  71.    olink1* cyclic_succ(olink1* p) const { return (p->succ==this) ? pred : p->succ; }
  72.    olink1* cyclic_pred(olink1* p) const { return (p->pred==this) ? succ : p->pred; }
  73.  
  74. // update operations
  75.  
  76.    void    insert(olink1* p, olink1* l);
  77.    olink1* del(olink1* loc);
  78.  
  79.    olink1* push(olink1* p)   { insert(p,this); }
  80.    olink1* append(olink1* p) { insert(p,pred); }
  81.  
  82.    olink1* pop()     { return del(succ); }
  83.    olink1* Pop()     { return del(pred); }
  84.  
  85.    void clear() { succ = pred = this; }
  86.  
  87.  
  88. // constructors & destructors
  89.  
  90.    olist1()  { succ = pred = this; }
  91.   ~olist1()  { clear(); }
  92.  
  93. };
  94.  
  95.  
  96. inline void olist1::insert(olink1* n, olink1* p) 
  97. { // insert n insert after p
  98.   olink1* s=p->succ;
  99.   n->pred = p;
  100.   n->succ = s;
  101.   p->succ = n;
  102.   s->pred = n;
  103.  }
  104.  
  105. inline olink1* olist1::del(olink1* x)
  106. { olink1*  p = x->pred;
  107.   olink1*  s = x->succ;
  108.   p->succ = s;
  109.   s->pred = p;
  110.   return x;
  111.  }
  112.  
  113.  
  114. #endif
  115.